package com.powernode.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.powernode.constant.ProductConstants;
import com.powernode.domain.ProdTag;
import com.powernode.mapper.ProdTagMapper;
import com.powernode.service.ProdTagService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.Caching;
import org.springframework.stereotype.Service;

import java.io.Serializable;
import java.security.Key;
import java.util.Date;
import java.util.List;

@Service
@CacheConfig(cacheNames = "com.powernode.service.impl.ProdTagServiceImpl")
public class ProdTagServiceImpl extends ServiceImpl<ProdTagMapper, ProdTag> implements ProdTagService {

    @Autowired
    ProdTagMapper prodTagMapper;

    /**
     * 保存产品标签信息
     * <p>
     * 此方法接收一个ProdTag对象作为参数，表示产品标签的信息
     * 它通过调用prodTagMapper的insert方法来插入产品标签信息到数据库
     * 如果插入操作影响的行数大于0，表示插入成功，方法返回true；否则返回false
     *
     * @param prodTag 产品标签信息对象，包含需要保存的产品标签数据
     * @return 返回一个Boolean值，表示产品标签信息是否成功保存到数据库中
     */
    @Override
    @Caching(evict = {@CacheEvict(key = ProductConstants.ALL_CATEGORY_LIST_KEY), @CacheEvict(key = ProductConstants.NORMAL_WX_PROD_TAG)})
    public Boolean saveProdTag(ProdTag prodTag) {
        prodTag.setCreateTime(new Date());
        prodTag.setUpdateTime(new Date());
        return prodTagMapper.insert(prodTag) > 0;
    }

    /**
     * 根据实体ID删除产品信息
     * <p>
     * 此方法使用缓存清除操作，以确保数据一致性它覆盖了父类的方法，专注于产品实体的删除
     * 使用 {@link CacheEvict} 注解来清除缓存中与指定键关联的数据，以保持数据的最新状态
     *
     * @param id 实体的唯一标识符，用于数据库中的查找和删除操作
     * @return 删除操作的结果，true 表示删除成功，false 表示删除失败
     */
    @Override
    @Caching(evict = {@CacheEvict(key = ProductConstants.ALL_CATEGORY_LIST_KEY), @CacheEvict(key = ProductConstants.NORMAL_WX_PROD_TAG)})
    public boolean removeById(Serializable id) {
        return super.removeById(id);
    }

    /**
     * 修改商品分组标签信息
     *
     * @param prodTag
     * @return
     */
    @Override
    @Caching(evict = {@CacheEvict(key = ProductConstants.ALL_CATEGORY_LIST_KEY), @CacheEvict(key = ProductConstants.NORMAL_WX_PROD_TAG)})
    public Boolean modifyProdTag(ProdTag prodTag) {
        prodTag.setUpdateTime(new Date());
        return prodTagMapper.updateById(prodTag) > 0;
    }

    /**
     * 查询产品标签列表
     * <p>
     * 本方法通过调用MyBatis-Plus的LambdaQueryWrapper构造查询条件，以获取所有状态为1（启用）的产品标签，并按照标签的顺序（seq）降序排列
     * 选择使用Lambda表达式是为了提高代码的可读性和易维护性
     *
     * @return 返回一个包含多个ProdTag对象的列表，这些对象满足查询条件
     */
    @Override
    @Caching(evict = {@CacheEvict(key = ProductConstants.ALL_CATEGORY_LIST_KEY), @CacheEvict(key = ProductConstants.NORMAL_WX_PROD_TAG)})
    public List<ProdTag> queryProdTagList() {
        return prodTagMapper.selectList(new LambdaQueryWrapper<ProdTag>().eq(ProdTag::getStatus, 1).orderByDesc(ProdTag::getSeq));
    }

    @Override
    @Cacheable(key = ProductConstants.NORMAL_WX_PROD_TAG)
    public List<ProdTag> queryWxProdTagList() {
        return prodTagMapper.selectList(new LambdaQueryWrapper<ProdTag>().eq(ProdTag::getStatus, 1).orderByDesc(ProdTag::getSeq));
    }
}
